/*自己写的1/10,基本的逻辑有错，不能保证所有的甜品甜度都是递增的，所有正好对的那个测试是甜度刚好递增*/
/*#include<bits/stdc++.h>

using namespace std;
const int M=1e5+7;
int v,n,m,ans=0,sum=0;
int a[M],b[M];

int main( )
{
    cin>>v>>n>>m;//经费，甜品数量，要买的甜品数
    for(int i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i];//甜度和价格
    }
    for(int i=n;i>=1;i--)
    {
       ans=a[i-1];
       sort(b+1,b+n);

        sum=b[i-1]+b[i]+b[1];
        if(sum<=v)
        {
            cout<<ans;
            break;
        }


    }
    return 0;
}*/
#include <bits/stdc++.h>
using namespace std;
// suml和sumr类似于前缀和
int v, m, a, b, n, ans, suml[100005], sumr[100005];
struct arr
{
    int a, b;
} e[100005];

bool comp(arr e1, arr e2)
{
    return e1.a < e2.a;
}

int main()
{
    cin >> v >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> e[i].a >> e[i].b;
    // 按甜度排序，方便下一步
    sort(e + 1, e + 1 + n, comp);
    // 因为只要找中位数，所以从数组的左边和右边，各找m / 2个价钱最少的
    // 这就需要优先队列（自动排序找价格）和类前缀和数组求左右遍历时，左/右 m / 2 个价钱和最小的和
    long unsigned int limit;
    if (m % 2)
        limit = m >> 1; // 奇数，将limit的值设置为m除以2的商
    else
        limit = (m >> 1) - 1; // 偶数
    priority_queue<int> q1, q2;
    for (int i = 1; i <= n; i++)
    {
        q1.push(e[i].b);
        suml[i] = suml[i - 1] + e[i].b;
        // 保证队列中只存m / 2个价格最小的甜品
        if (q1.size() > limit)
        {
            suml[i] -= q1.top();
            q1.pop();
        }
    }
    for (int i = n; i >= 1; i--)
    {
        q2.push(e[i].b);
        sumr[i] = sumr[i + 1] + e[i].b;
        if (q2.size() > limit)
        {
            sumr[i] -= q2.top();
            q2.pop();
        }
    }

    // 开始二分查找中位数
    // 如果m为奇数那就不用二分查找，遍历一下就行
    // 从m/2遍历到n-m/2
    if (m % 2)
    {
        for (int i = n - m / 2; i >= n / 2 + 1; i--)
        {
            if (suml[i - 1] + sumr[i + 1] + e[i].b <= v)
            {
                cout << e[i].a << endl;
                break;
            }
        }
    }
    else
    {
        // 先找到靠左的中位数，再找靠右边的
        for (int i = m / 2; i <= n - m / 2; i++)
        {
            // 开始二分法准备工作
            int l = i + 1, r = n - m / 2 + 1;
            int flag = 0;
            // 二分法开始
            while (l <= r)
            {
                int mid = l + (r - l) / 2;
                // 如果中位数和左右价值和的和符合题目条件，那么缩小左边界范围，向右寻找更大的中位数
                if (suml[i - 1] + sumr[i + 1] + e[i].b <= v)
                {
                    l = mid + 1;
                    flag = mid; // 此时flag就是右边界，也就是当前右最大中位数
                } // 否则缩小右边界范围
                else
                    r = mid - 1;
            }
            // 如果右最大中位数比左最大中位数大，那就说明本次搜索有效，更新ans
            if (flag > i)
                ans = max(ans, e[i].a + e[flag].a);
        }
        cout << ans / 2;
    }
    return 0;
}
